﻿using System;
using System.Collections.Generic;
using System.Text;
using AccesoDatos.IDAO;
using Entidades;
using log4net;
using NHibernate;


namespace AccesoDatos.DAO
{
    public class DaoParticipante : IDAO.IDaoParticipante
    {
        protected static readonly ILog log = LogManager.GetLogger(typeof(DaoParticipante));

        public IList<Participante> SeleccionarTodos()
        {
            try
            {

            
            log4net.Config.XmlConfigurator.Configure();
            log.Info("Entra en el metodo SeleccionarTodos");
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            sesion.BeginTransaction();
            IQuery query = sesion.CreateQuery("from Participante");
            IList<Participante> retorna = (IList<Participante>)query.List<Participante>();
            sesion.Transaction.Commit();
            log.Info("Lista de participantes retornada con exito");
            return retorna;
            }
            catch (ADOException exception)
            {

                log.Error("se ha producido un error en la seleccion de categorias");
                log.Error(exception.Message);
            }
            return null;

        }

        public Participante SeleccionarPorId(int id)
        {
            try
            {

            
            log4net.Config.XmlConfigurator.Configure();
            log.Info("Entra al metodo SeleccionarPorId recibiendo el valor: " + id);
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            sesion.BeginTransaction();
            Participante busqueda = (Participante)sesion.Get(typeof(Participante), id);
            sesion.Transaction.Commit();
            log.Info("Categoria retornada con éxito");
            return busqueda;
            }
            catch (ADOException exception)
            {
                log.Error("se ha producido un error en la seleccion de participante por id");
                log.Error(exception.Message);
                
            }
            return null;
        }

        public void Insertar(Participante c)
        {
            // throw new NotImplementedException();
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            ITransaction transaccion = null;
            try
            {
                transaccion = sesion.BeginTransaction();
                sesion.Save(c);
                transaccion.Commit();
                sesion.Flush();

            }
            catch (Exception e)
            {
                e.GetBaseException();
                if (transaccion != null)
                {
                    transaccion.Rollback();
                    throw;
                }
            }

        }

        public void Modificar(Participante c)
        {
            try
            {
                ConfiguracionNHibernate.CloseSession();
                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el método modificar recibiendo id: " + c.Idparticipante + " nombre: " + c.Nombre);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                sesion.Update(c);
                sesion.Transaction.Commit();
                log.Warn("Objeto Participante modificado con exito");
            }
            catch (ADOException exception)
            {
                log.Error("se ha producido un error en la modificación de participante");
                log.Error(exception.Message);
            }

          
        }

        public void EliminarPorId(int id)
        {
            try
            {

            
            log4net.Config.XmlConfigurator.Configure();
            log.Info("Entra en el método EliminarPorId recibiendo id: " + id);
            ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
            sesion.BeginTransaction();
            sesion.Delete((Participante)sesion.Get(typeof(Participante), id));
            sesion.Transaction.Commit();
            log.Warn("Objeto Categoria eliminado con exito");
            }
            catch (ADOException adoException)
            {

                log.Error("Error al eliminar Participante");
                log.Error(adoException.Message);
            }
        }

        public IList<Participante> SeleccionarPorParametro(string parametro, string valor)
        {
            try
            {


                log4net.Config.XmlConfigurator.Configure();
                log.Info("Entra en el metodo SeleccionarPorParametro recibiendo: parametro: " + parametro + " valor:" + valor);
                ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
                sesion.BeginTransaction();
                IQuery query = sesion.CreateQuery("from Participante where " + parametro + " = '" + valor + "'");
                IList<Participante> retorna = (IList<Participante>)query.List<Participante>();
                sesion.Transaction.Commit();
                log.Info("Se retorno la lista de categorias que cumplen con el parametro");
                return retorna;
            }
            catch (ADOException exception)
            {

                log.Error("Error al seleccionar Categoria por parametro");
                log.Error(exception.Message);
            }
            return null;
        }

     

       public IList<Participante> SeleccionarPar()
       {
           try
           {

           
           log4net.Config.XmlConfigurator.Configure();
           log.Info("Entra en el metodo SeleccionarTodos");
           ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
           sesion.BeginTransaction();
           IQuery query = sesion.CreateQuery("from Participante");
           IList<Participante> retorna = (IList<Participante>)query.List<Participante>();
           sesion.Transaction.Commit();
           log.Info("Lista de participante retornada");
           return retorna;
           }

           catch (ADOException exception)
           {
               log.Error("se ha producido un error en la seleccion de categorias");
                log.Error(exception.Message);
            
           }
           return null;
       }
       public Participante ParticipantePorId(int id)
       {
           try
           {

               log4net.Config.XmlConfigurator.Configure();
               log.Info("Entra al metodo SeleccionarPorId recibiendo el valor: " + id);
               ISession sesion = ConfiguracionNHibernate.GetCurrentSession();
               sesion.BeginTransaction();
               Participante busqueda = (Participante)sesion.Get(typeof(Participante), id);
               sesion.Transaction.Commit();
               log.Info("Participante retornado con éxito");
               return busqueda;
           }
           catch (ADOException exception)
           {

               log.Error("se ha producido un error en la seleccion de participante por id");
               log.Error(exception.Message);
           }
           return null;
       }
    }
}
